package kjhgffdds;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.SwingConstants;

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Vector;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.JTextArea;

public class ChatingServer extends JPanel implements Runnable {

	Vector<String> userList = new Vector<String>();
	ServerSocket serverSocket = null; // 기억하라.... 이부분에 대해서는 정말 아는게 아니라 모르니깐..

	 boolean acceptFlag = true;// 그저 이거나 저거나 초기갑을 지정해준다라고 하니 정의하는 부분이라 내가 외우지 않고는
								// 답이 없을 것이다.

	ArrayList<ServerThread> clients = new ArrayList<ServerThread>();
	public  JTextArea textArea = new JTextArea();//선언을 한 변수들이 가끔 내가 어디위치에 지정을 했는지 잘모르는 경우가 있는데 많이 머리가 아프다.
	private JTextField textField;// 내가 디자인 부분에서 사용한 부분들인데 너무 잘 까먹는다.
	private JTextField textField_1;// 자주 보고 신경을 써야 하는 부분이 되겠노라
	private JTextField textField_4;
	public JTextField textField_5;

	public JList list_1;

	/**
	 * Create the panel.
	 */
	public ChatingServer() {
		setLayout(null);

		JLabel lblIp = new JLabel("IP");
		lblIp.setBounds(12, 10, 57, 15);
		add(lblIp);

		textField = new JTextField();
		textField.setBounds(43, 7, 116, 21);
		add(textField);
		textField.setColumns(10);

		JLabel lblPort = new JLabel("Port");
		lblPort.setBounds(182, 10, 57, 15);
		add(lblPort);

		textField_1 = new JTextField();
		textField_1.setText("7777");
		textField_1.setBounds(219, 7, 116, 21);
		add(textField_1);
		textField_1.setColumns(10);

		JButton btnNewButton = new JButton("서버 시작");// 가끔 에러가 떳는데 해석을 몬해서 .. 당황을
													// 하는 경우가 너무 많은데 맨위에 변수지정을
													// 했나 신경을 쓰자.
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) { // 버튼들에 대해서 신경을 더 잘
															// 쓰도록 하자. 마지막에 얼마나
															// 생각하고 있나 점검을 하곤
															// 했을때 완전 이건 너무한 사태가
															// 발생을 해서 멘붕이다.
				
				Thread t = new Thread(ChatingServer.this);// 쓰레드 부분이다 페이지 622
															// 페이지에 Runnable 이
															// 일반적이라고도 나왔고 j프레임
															// 상속받기 때문에 또다른 상속을
															// 받기위해 사용을 한다.
				t.start();// 특별한 점은 t.start를 넣어줘야 출력이 된다고 한다.

			}
		});// ↓ 디자인에서 생성되는부분이라 그냥 신경을 써야 하는 부담이 적어지긴했으나 UI를 가끔 너무 이상하게 막...만들어서
			// 혼자 어찌 해야하는지 당황을 하는 상황이 너무나도 많이 발생하니.. 공부더 하자.
		btnNewButton.setBounds(353, 6, 97, 23);
		add(btnNewButton);

		JButton btnNewButton_1 = new JButton("서버 중지");
		btnNewButton_1.setBounds(465, 6, 97, 23);
		add(btnNewButton_1);

		textField_4 = new JTextField();
		textField_4.setBackground(Color.GREEN);
		textField_4.setHorizontalAlignment(SwingConstants.CENTER);
		textField_4.setText("이모티콘");
		textField_4.setBounds(12, 269, 116, 21);
		add(textField_4);
		textField_4.setColumns(10);

		textField_5 = new JTextField();
		textField_5.setBounds(142, 269, 313, 21);
		add(textField_5);
		textField_5.setColumns(10);

		JButton btnWdwd = new JButton("전송");
		btnWdwd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				
				
				
				
				
				
				
				ChatData cd = new ChatData();
				cd.setCommand("message");
				cd.setMessage(textField_5.getText());  // 사람들에게 입력을 요구하는 부분이다 , 그리고 입력이 끝나면 데이터를 겟으로 받아 전송 버튼이 실행이 되는데 도움을 주는 것이 된다 
				cd.setId("Server");// 데이터 들을 서버로 받아야 한다..
				
				for(ServerThread st: clients){
					st.send(cd);  // ServerThread.private ObjectOutputStream send(ChatData);라고 생각하자  
				}
				textField_5.setText(cd.getMessage() + "\n"); // 
				textField_5.setText("");
				
			}
		});

		btnWdwd.setBounds(465, 247, 82, 43);
		add(btnWdwd);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(22, 35, 173, 207);
		add(scrollPane);

		list_1 = new JList();
		scrollPane.setViewportView(list_1);
		
		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(229, 35, 306, 207);
		add(scrollPane_1);
		
		
		scrollPane_1.setViewportView(textArea);

	}

	@Override
	public void run() {// 전송하는 소스의 가장 밑 부분에서 ....사용?or 그냥 가장 밑부분..

		//
		System.out.println("서버 run");

		try {

			InetAddress localhost = InetAddress.getLocalHost();
			textField.setText(localhost.getHostAddress()); // data에서 get,set 설정을
															// 하면 딱히 지정할필요 없음
			serverSocket = new ServerSocket(7777); // serverSocket 은.. 뭐하는건지
													// 잘모르지만 새로운 변수를 같은이름으로 한
													// 건..딱히 할게없단다
			
			//
			System.out.println("서버 Try");

			while (acceptFlag) {

				Socket client = serverSocket.accept();
				
				
				textArea.append(client.getInetAddress() + "\n");
				//
				System.out.println("서버 접속");

				textArea.append("어서와!" + "\n"); // 상대방이 접속을하고 들어오게 된다면 내가
												// 상대방이 접속을 했다고 나의 화면에 표시가됨

				ServerThread st = new ServerThread(this, client);
				clients.add(st);

				ChatData cd = new ChatData(); // 기본의 정보를 설정해준 대서 호출을하고 새롭게 선언을
												// 한다.
				cd.setMessage("서버에 접속되었습니다.");// 말그대로 접속을 해서 들어오게 된다면 확인이
												// 되는사항이란다.
			
				//
				System.out.println("서버" + cd.getMessage());

			}

		} catch (Exception ex) {
			// try catch 오류를 잡는 부분이라고 생각하면 편할까..?, 약간의 오류를 무시한다

		}

	}
}
